package com.roll;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;
import java.util.ResourceBundle;
import java.util.stream.Collectors;

/**
 * 增加自动功能,转动和停止按钮合并成一个按钮,重构包名和类名,精简了其他冗余的展示label,只展示roll到的name
 *
 * @author by cheer
 * @version 3.0
 * @date 2019年9月15日 16:55:19
 */
public class Roll extends JFrame {
    java.util.List<String> nameList;// 存储name的list
    Boolean isRolling = true;// 转动,停止状态
    // 一共使用到两个Timer!!!
    // 这个timer是javax.swing中的,为什么使用这个timer?因为那时觉得这个timer可以绑定监听器,每隔delay毫秒的频率触发.
    Timer timer = new Timer(100, new TimerListener());
    // 这个timer是java.util中的,这个timer当然也可以频率触发,但是这里只使用其延时触发一次的功能
    java.util.Timer utilTimer;
    // 两种字体
    Font fontMid = new Font("Serif", Font.BOLD, 42);// 按钮使用中号字体
    Font fontBig = new Font("Serif", Font.BOLD, 102);// 内容使用大号字体
    // name展示的标签
    JLabel jtfName = new JLabel("请期待!", (int) LEFT_ALIGNMENT);
    // 三个按钮
    JButton jbtRoleAuto = new JButton("自动");
    JButton jbtRoll = new JButton("转动");
    JButton jbtReset = new JButton("复位");

    public Roll() {
        // 设置字体
        jtfName.setFont(fontBig);// name字体
        jbtRoleAuto.setFont(fontMid);// 按钮字体
        jbtRoll.setFont(fontMid);// 按钮字体
        jbtReset.setFont(fontMid);// 按钮字体
        // 读取name的配置文件
        try {
            ResourceBundle bundle = ResourceBundle.getBundle("name");
            String names = new String(bundle.getString("name").getBytes("ISO-8859-1"), "UTF-8");
            String[] nameArr = names.split(",");
            nameList = Arrays.asList(nameArr);
            // 容错,防止重复了逗号或结尾多出逗号
            nameList = nameList.stream().filter(s -> !"".equals(s)).collect(Collectors.toList());
        } catch (Exception exception) {
            jtfName.setFont(fontMid);
            jtfName.setText("出错了!配置文件(夹)不正确!");
            System.out.println("请将resource文件夹设置为source root!!!");
            exception.printStackTrace();
        }

        // 两个面板
        JPanel p1 = new JPanel(new BorderLayout());// 显示name的面板
        JPanel p2 = new JPanel(new GridLayout(3, 1));// 按钮布局面板
        // 一个标签和三个按钮添加到面板
        p1.add(jtfName, BorderLayout.CENTER);
        p2.add(jbtRoleAuto);
        p2.add(jbtRoll);
        p2.add(jbtReset);
        // 两个面板添加到frame
        add(p1, BorderLayout.CENTER);
        add(p2, BorderLayout.EAST);
        // 自动按钮
        jbtRoleAuto.addActionListener(e -> {
            if (isRolling) {// 不重复触发
                jbtRoleAuto.setText("稍等");
                isRolling = false;
                timer.start();
                // 2秒后按钮停止
                utilTimer = new java.util.Timer(true);
                utilTimer.schedule(new java.util.TimerTask() {
                    @Override
                    public void run() {
                        timer.stop();
                        jbtRoleAuto.setText("自动");
                        isRolling = true;
                    }
                }, 2000);
            }
        });
        // 转动,停止按钮
        jbtRoll.addActionListener(e -> {
            if (isRolling) {
                jbtRoll.setText("停止");
                timer.start();
            } else {
                jbtRoll.setText("转动");
                timer.stop();
            }
            isRolling = !isRolling;
        });
        // 复位按钮
        jbtReset.addActionListener(e -> {
            if (utilTimer != null) {
                utilTimer.cancel();
            }
            timer.stop();
            jbtRoleAuto.setText("自动");
            jbtRoll.setText("转动");
            jtfName.setText("请期待!");
            isRolling = true;
        });
    }

    // 按钮转动,停止,使用的监听器
    public class TimerListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            int random = (int) (Math.random() * nameList.size());
            String name = nameList.get(random);
            jtfName.setText(name);
        }
    }

    public static void main(String[] args) {
        Roll frame = new Roll();
        frame.setTitle("点名系统");
        frame.setSize(720, 350);
        frame.setLocationRelativeTo(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }

}
